package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKContacto;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoContacto;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.TipoContacto;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBContacto")
@Scope("request")
public class MBContacto extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBContacto.class);
    @Inject
    public BKContacto bkContacto;
    @Inject
    public IServicioTipoContacto servicioTipoContacto;
    @Autowired
    BKSession session;

    public MBContacto() {
    }

    public void eliminarContacto(ActionEvent actionEvent) {

        Contacto contactoEliminado = this.bkContacto.getCurrentContacto();

        if (contactoEliminado.getId() == null) {
            Iterator itr = this.bkContacto.getListaContacto().iterator();
            while (itr.hasNext()) {
                Contacto cont = (Contacto) itr.next();
                if (contactoEliminado.getNombre().equals(cont.getNombre())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            this.bkContacto.getListaContacto().remove(contactoEliminado);

            Integer index = bkContacto.getListaContactoEditar().indexOf(contactoEliminado);
            contactoEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            contactoEliminado.setFecModficacion(new Date());
            contactoEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkContacto.getListaContactoEditar().set(index, contactoEliminado);
        }
    }

    public void agregarContacto(ActionEvent actionEvent) {
        Contacto contactoAgregado = this.bkContacto.getFormularioContacto();

        contactoAgregado.setUsrCreacion(session.getUsuario().getUsuario());
        contactoAgregado.setFecCreacion(new Date());
        contactoAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
        try {
            contactoAgregado.setIdTipoContacto(servicioTipoContacto.conseguirTipoContactoPorId(this.bkContacto.getTipoContacto()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }

        boolean band = false;
        for (Contacto cont : this.bkContacto.getListaContacto()) {
            if (contactoAgregado.getNombre().equals(cont.getNombre())) {
                band = true;
                break;
            }
        }

        if (band) {
            mostrarError("Ya se agrego el contacto con el nombre: " + contactoAgregado.getNombre());
        } else {
            this.bkContacto.getListaContacto().add(contactoAgregado);
            this.bkContacto.getListaContactoEditar().add(contactoAgregado);
            this.bkContacto.setFormularioContacto(new Contacto());
        }
    }

    public void editarContacto(RowEditEvent event) {
        Contacto contactoEditado = (Contacto) event.getObject();
        Integer index = bkContacto.getListaContactoEditar().indexOf(contactoEditado);
        
        try {
            //TipoContacto tipo = );
            contactoEditado.setIdTipoContacto(servicioTipoContacto.conseguirTipoContactoPorId(contactoEditado.getIdTipoContacto().getId()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }

        if (contactoEditado.getId() != null) {
            contactoEditado.setUsrModificacion(session.getUsuario().getUsuario());
            contactoEditado.setFecModficacion(new Date());
        }

        this.bkContacto.getListaContactoEditar().set(index, contactoEditado);
    }

    public Collection<TipoContacto> buscarTipoContacto(String tipoContactoABuscar) {
        //bkContacto.setEstaOrdenPedidoSeleccionado(false);
        Collection<TipoContacto> listaTipoContactoEncontrados = new ArrayList<TipoContacto>();
        for (TipoContacto tipoContacto : this.bkContacto.getListaTipoContacto()) {
            if (tipoContacto.getNombre().startsWith(tipoContactoABuscar)) {
                listaTipoContactoEncontrados.add(tipoContacto);
            }
        }
        return listaTipoContactoEncontrados;
    }
}
